package com.grandt.model.database.manager;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import com.grandt.model.beans.jugadores.FiltroJugadores;
import com.grandt.model.beans.jugadores.Jugador;
import com.grandt.model.configuration.ConfigurationBean;
import com.grandt.model.exceptions.BuscarDatosException;

public class DataBaseJugador extends ManagerDataBase {

	private DataBaseFecha	fechas;
	public DataBaseJugador(ConfigurationBean configuration) {
		super(configuration);
		fechas = new DataBaseFecha(configuration);
	}

	@Override
	protected String getStrInsert() {
		String query="INSERT INTO JUGADOR(apellido,nombre,equipo,precio,posicion)" +
				" VALUES (?,?,?,?,?)";
		return query;
	}

	@Override
	protected void insertParameters(PreparedStatement prst,Object o) throws SQLException {
		Jugador jugador = (Jugador) o;
		prst.setString(1, jugador.getApellido());
		prst.setString(2, jugador.getNombre());
		prst.setString(3, jugador.getEquipo());
		prst.setLong(4, jugador.getPrecio());
		prst.setString(5, jugador.getPosicion().toString());
	}
	@Override
	protected List<Object> getResult(ResultSet result) {
		return null;
	}
	@Override
	protected String getStrQuery() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	protected void queryParameters(PreparedStatement prst, Object o) {
		// TODO Auto-generated method stub
		
	}

	public List<Jugador> getJugadores() throws BuscarDatosException {
		List<Jugador> jugadores = new LinkedList<Jugador>();
		try {

			String query = "Select * from JUGADOR ";
			PreparedStatement prst;
			prst = connection.prepareStatement(query);
			ResultSet result = prst.executeQuery();
			while (result.next()) {
				jugadores.add(getJugador(result));
				
			}
			prst.close();
		} catch (SQLException e) {
			throw new BuscarDatosException(e);
		}
		return jugadores;
	}
	private Jugador getJugador(ResultSet result) throws SQLException, BuscarDatosException {
		Jugador jugador = new Jugador();
		jugador.setNombre(result.getString("NOMBRE"));
		jugador.setApellido(result.getString("APELLIDO"));
		jugador.setId(result.getInt("ID"));
		jugador.setEquipo(result.getString("EQUIPO"));
		jugador.setPrecio(result.getInt("PRECIO"));
		jugador.setPosicion(result.getString("POSICION"));
		jugador.setFechas(getFechas(result.getInt("ID")));
		return jugador;
	}
	private Map<String, Integer> getFechas(int idJugador) throws BuscarDatosException {
		return fechas.getFechas(idJugador);		
	}

	public List<Jugador> getJugadores(FiltroJugadores filtro) throws BuscarDatosException {
		List<Jugador> jugadores = new LinkedList<Jugador>();
		try {
			
			String query = "Select * from JUGADOR ";
			String condiciones = getCondiciones(filtro);
			if(!condiciones.equals("")){
				query+=" WHERE "+condiciones;
			}
			PreparedStatement prst;
			prst = connection.prepareStatement(query);
			ResultSet result = prst.executeQuery();
			while (result.next()) {
				jugadores.add(getJugador(result));
				
			}
			prst.close();
		} catch (SQLException e) {
			throw new BuscarDatosException(e);
		}
		return jugadores;
	}


	private String getCondiciones(FiltroJugadores filtro) {
		List<String> list = new LinkedList<String>();
		String condiciones="";
		if(filtro!=null){
			if(filtro.getClub()!=null && !filtro.getClub().equals("")){
				list.add(" EQUIPO='"+filtro.getClub()+"'");
			}
			if(filtro.getPosicion()!=null && !filtro.getPosicion().equals("")){
				list.add(" POSICION='"+filtro.getPosicion()+"'");
			}
			if(filtro.getMinimo()!=null && !filtro.getMinimo().equals("") || 
			   filtro.getMaximo()!=null && !filtro.getMaximo().equals("")){
				String precio="";
				if(filtro.getMinimo()!=null && !filtro.getMinimo().equals("")){
					precio+=" PRECIO>="+filtro.getMinimo()+"";
				}
				
				if(filtro.getMaximo()!=null && !filtro.getMaximo().equals("")){
					if(!precio.equals("")){
						precio+=" AND ";
					}
					precio+=" PRECIO<="+filtro.getMaximo()+"";
				}
				list.add(precio);
			}
		}
		int count=0;
		for (String value : list) {
			condiciones+=value;
			count++;
			if(count<list.size() ){
				condiciones+=" AND ";				
			}
			
		}
		return condiciones;
	}

	public Jugador getJugador(String nombre) throws BuscarDatosException {
		Jugador jugador = new Jugador();
		try {

			String query = "Select * from JUGADOR Where id=?";
			PreparedStatement prst;
			prst = connection.prepareStatement(query);
			prst.setInt(1, Integer.valueOf(nombre));
			ResultSet result = prst.executeQuery();
			while (result.next()) {
				jugador = getJugador(result);
				
			}
			prst.close();
		} catch (SQLException e) {
			throw new BuscarDatosException(e);
		}
		return jugador;
	}
	public Jugador getJugador(String nombre,String apellido) throws BuscarDatosException {
		Jugador jugador = null;
		try {

			String query = "Select * from JUGADOR Where nombre=? AND apellido=?";
			PreparedStatement prst;
			prst = connection.prepareStatement(query);
			prst.setString(1, nombre);
			prst.setString(2, apellido);
			ResultSet result = prst.executeQuery();
			if (result.next()) {
				jugador = getJugador(result);
				
			}
			prst.close();
		} catch (SQLException e) {
			throw new BuscarDatosException(e);
		}
		return jugador;
	}

}
